#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096 

int main(int argc ,char **argv)//argc是输入变量的参数个数，argv[0],argv[1],argv[2]....argv[argc-1]，argv[argc]==NULL.argv[0]:可执行文件。对于server来讲，那么argv[0]==./server;对于client来讲：argv[0]=./client,argv[1]=IP地址。
 {
    int listenfd ,connfd;//定义一个监听和链接的描述符
    struct sockaddr_in servaddr;//servaddr服务器端结构体变量
    char RevBuff[4096];//接收缓冲区
    char SendBuff[4096];//发送缓冲区
    int n,m;
    if( (listenfd =socket(AF_INET ,SOCK_STREAM , 0) ) == -1 )//以tcp方式建立起连接返回的listenfd一般是大于0的数 表示的是监听使用的描述符
    {
        printf("create socket error:%s(errno:%d)\n",strerror(errno),errno)     ;
	      exit(0);
    }
    
    memset(&servaddr , 0 ,sizeof(servaddr));//将结构体servaddr中的值用0代替
    servaddr.sin_family = AF_INET;//表示协议簇，一般用AF_INET表示TCP/IP协议
    /*
     *htonl()函数：将一个32位数从主机字节顺序转换成网络字节顺序
     *返回值：返回一个网络字节顺序的值 
     */
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//sin_addr是一个联合体，用联合体就可以使用多种方式表示IP地址。一般我们使用其中的最后一种方式，即用无误号长整数数据来表示IP地址。此时，用的s_nu数据成员，s_un是一个结构提，其中只有一个数据成员，即s_addr.
    servaddr.sin_port = htons(6666);
    if( bind(listenfd  , (struct sockaddr *)&servaddr , sizeof(servaddr) )== -1 )//bind()函数把一个地址族中的特定地址赋给socket
    {
	      printf("bind socket error :%s (errno:%d)\n",strerror(errno),errno);
	      exit(0);
    }
    
    if( (listen(listenfd,10)) == -1)//监听，通知客户端表示自己准备好了，10代表监听的client的个数
    {
	      printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }
    
    printf("=============check whether the connection is established=======\n");
    
    while(1)
    {	
    	if( ( connfd = accept(listenfd ,(struct sockaddr *)NULL,NULL ))==-1 )//检测是否成功建立链接，如果成功则跳出，connfd是一个链接描述符
    	{	
		      printf("accept socket error :%s(errno:%d)",strerror(errno),errno);
		      continue;
    	}
	    else break;
    }

    printf("=============connection is established~!now waiting for client's request=======\n");//等待客户端的请求
    
    while(1)
    {
	     n = recv(connfd,RevBuff ,MAXLINE,0);//从客户端接收信息
	     RevBuff[n]='\0';
	     printf("recv msg from client:%s",RevBuff);

	     printf("send msg to client:");//向客户端发送信息
    	 fgets(SendBuff, 4096,stdin);//gets(sendline);
    	 if( send(connfd ,SendBuff ,strlen(SendBuff),0 ) <0 )
    	{
		      printf("send msg error:%s(errno:%d)\n",strerror(errno),errno);
        	exit(0);
    	}
    }
    close(connfd);
    close(listenfd) ;
}















